package backTracking;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;

/*
* 给出 n 代表生成括号的对数，请你写出一个函数，使其能够生成所有可能的并且有效的括号组合。

例如，给出 n = 3，生成结果为：

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class GenerateParenthesis {

//    List<String> lists = new ArrayList<>();
//    public List<String> generateParenthesis(int n) {
//        if(n == 0){
//            return new ArrayList<>();
//        }
//        generate(2* n, "", 0);
//        return lists;
//    }
//
//    public void generate(int n, String s, int leftCount){
//
//        if(n == 0 && leftCount == 1){
//            s = s + ")";
//            lists.add(s);
//        } else {
//            if(leftCount < n){
//                generate(n - 1, s + "(", leftCount - 1);
//            }
//            if(leftCount > 0) {
//                generate(n - 1, s + ")", leftCount + 1);
//            }
//        }
//    }
//


    public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList();
        backtrack(ans, "", 0, 0, n);
        return ans;
    }

    public void backtrack(List<String> ans, String cur, int open, int close, int max){
        if (cur.length() == max * 2) {
            ans.add(cur);
            return;
        }

        if (open < max)
            backtrack(ans, cur+"(", open+1, close, max);
        if (close < open)
            backtrack(ans, cur+")", open, close+1, max);
    }

}
